import requests
import json
import os

# -- coding: utf-8 --
import sys
import io
from dotenv import load_dotenv

# 设置标准输出的编码为UTF-8
if sys.stdout.encoding != "UTF-8":
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")


class DeepSeekClient:
    def __init__(self, api_key=None):
        # 优先使用传入的API密钥，其次从环境变量读取
        self.api_key = api_key or os.getenv("DEEPSEEK_API_KEY")

        if not self.api_key:
            raise ValueError("请提供DeepSeek API密钥，或设置环境变量 DEEPSEEK_API_KEY")

        self.base_url = "https://api.deepseek.com/v1/chat/completions"
        self.headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {self.api_key}",
        }

    def call_api(self, prompt, model="deepseek-chat", temperature=0.7, max_tokens=500):
        """
        调用DeepSeek API
        """
        data = {
            "model": model,
            "messages": [{"role": "user", "content": prompt}],
            "temperature": temperature,
            "max_tokens": max_tokens,
            "stream": False,
        }

        try:
            print("正在调用DeepSeek API...")
            response = requests.post(
                self.base_url, headers=self.headers, json=data, timeout=30  # 30秒超时
            )

            if response.status_code == 200:
                result = response.json()
                return result["choices"][0]["message"]["content"]
            else:
                return f"API调用失败: 状态码 {response.status_code}, 错误信息: {response.text}"

        except requests.exceptions.Timeout:
            return "请求超时，请稍后重试"
        except requests.exceptions.ConnectionError:
            return "网络连接错误，请检查网络"
        except Exception as e:
            return f"发生未知错误: {str(e)}"


def load_environment():
    """加载环境变量"""
    load_dotenv()
    api_key = os.getenv("DEEPSEEK_API_KEY")

    if not api_key or api_key == "请输入你的DEEPSEEK_API_KEY":
        print("❌ 请在 .env 文件中设置正确的 DEEPSEEK_API_KEY")
        return None

    print(f"✅ API Key加载成功: {api_key[:10]}...")
    return api_key


def test_api_connection(api_key):
    """测试API连接是否正常"""
    client = DeepSeekClient(api_key)
    test_prompt = "请回复'API连接成功'"
    result = client.call_api(test_prompt)
    return result


def chain_of_thought_demo(client):
    """
    思维链提示词演示
    """
    prompt = """
  请解决以下问题，并展示你的推理步骤：

问题：如果小明有5个苹果，他给了小红2个，然后又买了3个，最后他有多少个苹果？

请一步步思考，并在最后给出答案。
"""

    print("正在进行思维链演示...")
    print("问题：小明苹果数量计算")
    print("-" * 40)

    result = client.call_api(prompt)
    return result


def structured_output_demo(client):
    """
    结构化输出演示
    """
    prompt = """
    请将以下文本中的个人信息提取为JSON格式：

文本："张三，25岁，来自北京，职业是软件工程师，擅长Python和Java编程。"

要求输出格式：
{
  "name": "",
  "age": ,
  "city": "",
  "profession": "",
  "skills": []
}

请只输出JSON格式的内容，不要有其他文字。
"""

    print("\n正在进行结构化输出演示...")
    print("任务：信息提取为JSON格式")
    print("-" * 40)

    result = client.call_api(prompt, temperature=0.1)  # 低temperature确保输出稳定
    return result


if __name__ == "__main__":
    api_key = load_environment()
    if not api_key:
        sys.exit(1)

    # 测试连接
    print("测试API连接...")
    test_result = test_api_connection(api_key)
    print(f"测试结果：{test_result}")

    # 如果连接成功，执行所有任务
    if "API连接成功" in test_result:
        client = DeepSeekClient(api_key)

        # 执行思维链任务
        print("\n" + "=" * 60)
        print("任务1: 思维链实践")
        print("=" * 60)
        thought_result = chain_of_thought_demo(client)
        print(thought_result)

        # 执行结构化输出任务
        print("\n" + "=" * 60)
        print("任务2: 结构化输出实践")
        print("=" * 60)
        json_result = structured_output_demo(client)
        print(json_result)

        # 尝试解析JSON验证格式是否正确
        try:
            parsed_json = json.loads(json_result.strip())
            print("\n✅ JSON格式验证成功！")
            print("解析后的数据：")
            print(json.dumps(parsed_json, indent=2, ensure_ascii=False))
        except json.JSONDecodeError as e:
            print(f"\n❌ JSON格式验证失败: {e}")
            print("原始输出：")
            print(json_result)
        except Exception as e:
            print(f"\n❌ 验证过程中发生错误: {e}")
